<?php

namespace origin;

/**
 * CURL类
 * @author dece <decezz@qq.com>
 */
class Curl
{
    /**
     * curl 配置文件
     */
    protected static $option = [
        CURLOPT_URL             => '',
        CURLOPT_RETURNTRANSFER  => 1,       // true 以字符串形式返回不直接输出
        CURLOPT_SSL_VERIFYPEER  => 0,       // 0 禁止验证对等证书
        CURLOPT_SSL_VERIFYHOST  => 0,       // 0 为不检查服务器SSL证书中是否存在一个公用名名称
        CURLOPT_CONNECTTIMEOUT  => 3,       // 在尝试连接时等待的秒数
        CURLOPT_TIMEOUT         => 9,       // 超时时间
        CURLOPT_HEADER          => 0,       // 启用时会将头文件的信息作为数据流输出
    ];

    /**
     * 发送POST请求
     * @param  string   $url        post的请求地址
     * @param  array    $params     post的请求参数
     * @param  array    $header     post的header
     * @param  array    $option     curl的设置参数
     * @param  mixed    $opt        curl_getinfo参数
     * @return array    $result     请求结果
     */
    public static function post( $url , $params = [] , $header = [] , $option = [] , $opt = null )
    {
        self::$option[CURLOPT_URL]          = $url;
        self::$option[CURLOPT_POST]         = true;
        self::$option[CURLOPT_POSTFIELDS]   = $params;
        // 设定haeder
        if ($header && is_array($header)) {
            self::$option[CURLOPT_HTTPHEADER] = $header;
        }

        $option = $option + self::$option;

        return self::exec($option, $opt);
    }

    /**
     * 发送GET请求
     * @param  string   $url        get的请求地址
     * @param  array    $params     get的请求参数
     * @param  array    $header     get的header
     * @param  array    $option     curl的设置参数
     * @param  mixed    $opt        curl_getinfo参数
     * @return array    $result     请求结果
     */
    public static function get( $url , $params = [] , $header = [] , $option = [] , $opt = null )
    {
        // 参数存在
        if ($params && is_array($params)) {
            $url = $url .'?'. http_build_query($params);
        }
        self::$option[CURLOPT_URL] = $url;
        // 设定haeder
        if ($header && is_array($header)) {
            self::$option[CURLOPT_HTTPHEADER] = $header;
        }

        $option = $option + self::$option;

        return self::exec($option, $opt);
    }

    /**
     * 发送请求
     * @param  array    $option     curl的设置参数
     * @param  mixed    $opt        curl_getinfo参数
     * @return array    $result     请求结果
     */
    public static function exec( $option = [] , $opt = null )
    {
        // 初始化
        $ch = curl_init();
        // 设定参数
        curl_setopt_array($ch, $option);
        // 执行发送
        $response = curl_exec($ch);
        // 错误代码
        $errno = curl_errno($ch);
        // 错误信息
        $error = curl_error($ch);
        // 请求结果
        $result = [
            'code'      => $errno,
            'error'     => $error,
            'data'      => $response,
        ];
        // 获取资源信息
        if ($opt !== null) {
            if (is_numeric($opt)) {
                // 获取指定code
                $result['info'] = curl_getinfo($ch, $opt) ;
            } elseif (is_array($opt)) {
                // 循环信息
                foreach ($opt as $val) {
                    $result[$val] = curl_getinfo($ch, $val) ;
                }
            } else {
                $result['info'] = curl_getinfo($ch);
            }
        }
        // 关闭句柄
        curl_close($ch);
        // 返回结果
        return $result;
    }
}